/**
 * 验证码工具类
 */

// 验证码类型枚举
export const CAPTCHA_TYPE = {
  LOGIN: 'login',           // 登录验证码
  REGISTER: 'register',     // 注册验证码
  RESET_PASSWORD: 'reset',  // 重置密码验证码
  CHANGE_PHONE: 'change'    // 更换手机号验证码
}

// 验证码长度配置
export const CAPTCHA_CONFIG = {
  SMS_LENGTH: 6,      // 短信验证码长度
  IMAGE_LENGTH: 4,    // 图形验证码长度
  COUNTDOWN: 60,      // 倒计时秒数
  MAX_RETRY: 3        // 最大重试次数
}

/**
 * 验证码管理类
 */
export class CaptchaManager {
  constructor() {
    this.timers = new Map() // 存储各种类型的倒计时器
    this.retryCounts = new Map() // 存储重试次数
  }

  /**
   * 验证手机号格式
   * @param {string} phone 手机号
   * @returns {boolean} 是否有效
   */
  validatePhone(phone) {
    const phoneReg = /^1[3-9]\d{9}$/
    return phoneReg.test(phone)
  }

  /**
   * 验证图形验证码格式
   * @param {string} code 验证码
   * @returns {boolean} 是否有效
   */
  validateImageCaptcha(code) {
    return code && code.length === CAPTCHA_CONFIG.IMAGE_LENGTH
  }

  /**
   * 验证短信验证码格式
   * @param {string} code 验证码
   * @returns {boolean} 是否有效
   */
  validateSmsCode(code) {
    return code && code.length === CAPTCHA_CONFIG.SMS_LENGTH && /^\d{6}$/.test(code)
  }

  /**
   * 开始倒计时
   * @param {string} type 验证码类型
   * @param {function} callback 倒计时回调函数
   * @param {number} seconds 倒计时秒数
   */
  startCountdown(type, callback, seconds = CAPTCHA_CONFIG.COUNTDOWN) {
    // 清除已存在的计时器
    this.clearCountdown(type)
    
    let count = seconds
    callback(count)
    
    const timer = setInterval(() => {
      count--
      callback(count)
      
      if (count <= 0) {
        this.clearCountdown(type)
      }
    }, 1000)
    
    this.timers.set(type, timer)
  }

  /**
   * 清除倒计时
   * @param {string} type 验证码类型
   */
  clearCountdown(type) {
    const timer = this.timers.get(type)
    if (timer) {
      clearInterval(timer)
      this.timers.delete(type)
    }
  }

  /**
   * 清除所有倒计时
   */
  clearAllCountdowns() {
    this.timers.forEach((timer) => {
      clearInterval(timer)
    })
    this.timers.clear()
  }

  /**
   * 增加重试次数
   * @param {string} type 验证码类型
   * @returns {number} 当前重试次数
   */
  incrementRetry(type) {
    const current = this.retryCounts.get(type) || 0
    const newCount = current + 1
    this.retryCounts.set(type, newCount)
    return newCount
  }

  /**
   * 重置重试次数
   * @param {string} type 验证码类型
   */
  resetRetry(type) {
    this.retryCounts.delete(type)
  }

  /**
   * 检查是否超过最大重试次数
   * @param {string} type 验证码类型
   * @returns {boolean} 是否超过限制
   */
  isRetryLimitExceeded(type) {
    const count = this.retryCounts.get(type) || 0
    return count >= CAPTCHA_CONFIG.MAX_RETRY
  }

  /**
   * 获取剩余重试次数
   * @param {string} type 验证码类型
   * @returns {number} 剩余次数
   */
  getRemainingRetries(type) {
    const used = this.retryCounts.get(type) || 0
    return Math.max(0, CAPTCHA_CONFIG.MAX_RETRY - used)
  }

  /**
   * 生成随机验证码
   * @param {number} length 长度
   * @param {boolean} numbersOnly 是否只包含数字
   * @returns {string} 验证码
   */
  generateCode(length = 6, numbersOnly = true) {
    const chars = numbersOnly ? '0123456789' : 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
    let result = ''
    for (let i = 0; i < length; i++) {
      result += chars.charAt(Math.floor(Math.random() * chars.length))
    }
    return result
  }

  /**
   * 格式化倒计时显示文本
   * @param {number} seconds 剩余秒数
   * @param {string} defaultText 默认文本
   * @returns {string} 显示文本
   */
  formatCountdownText(seconds, defaultText = '获取验证码') {
    return seconds > 0 ? `${seconds}s` : defaultText
  }

  /**
   * 销毁管理器，清理所有资源
   */
  destroy() {
    this.clearAllCountdowns()
    this.retryCounts.clear()
  }
}

/**
 * 全局验证码管理器实例
 */
export const captchaManager = new CaptchaManager()

/**
 * 验证码相关的工具函数
 */
export const captchaUtils = {
  /**
   * 格式化手机号显示（中间4位用*代替）
   * @param {string} phone 手机号
   * @returns {string} 格式化后的手机号
   */
  formatPhone(phone) {
    if (!phone || phone.length !== 11) return phone
    return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
  },

  /**
   * 获取验证码发送成功提示文本
   * @param {string} phone 手机号
   * @returns {string} 提示文本
   */
  getSendSuccessText(phone) {
    return `验证码已发送至 ${this.formatPhone(phone)}`
  },

  /**
   * 获取验证码类型的中文描述
   * @param {string} type 验证码类型
   * @returns {string} 中文描述
   */
  getTypeDescription(type) {
    const descriptions = {
      [CAPTCHA_TYPE.LOGIN]: '登录',
      [CAPTCHA_TYPE.REGISTER]: '注册',
      [CAPTCHA_TYPE.RESET_PASSWORD]: '重置密码',
      [CAPTCHA_TYPE.CHANGE_PHONE]: '更换手机号'
    }
    return descriptions[type] || '验证'
  },

  /**
   * 检查验证码是否过期
   * @param {number} timestamp 发送时间戳
   * @param {number} expireMinutes 过期分钟数，默认5分钟
   * @returns {boolean} 是否过期
   */
  isExpired(timestamp, expireMinutes = 5) {
    const now = Date.now()
    const expireTime = expireMinutes * 60 * 1000
    return (now - timestamp) > expireTime
  },

  /**
   * 生成验证码请求的唯一标识
   * @param {string} phone 手机号
   * @param {string} type 验证码类型
   * @returns {string} 唯一标识
   */
  generateRequestId(phone, type) {
    return `${type}_${phone}_${Date.now()}`
  }
}

/**
 * 验证码错误类型
 */
export const CAPTCHA_ERRORS = {
  PHONE_INVALID: 'PHONE_INVALID',
  IMAGE_CAPTCHA_INVALID: 'IMAGE_CAPTCHA_INVALID',
  SMS_CODE_INVALID: 'SMS_CODE_INVALID',
  SEND_TOO_FREQUENT: 'SEND_TOO_FREQUENT',
  RETRY_LIMIT_EXCEEDED: 'RETRY_LIMIT_EXCEEDED',
  NETWORK_ERROR: 'NETWORK_ERROR',
  SERVER_ERROR: 'SERVER_ERROR'
}

/**
 * 验证码错误信息映射
 */
export const CAPTCHA_ERROR_MESSAGES = {
  [CAPTCHA_ERRORS.PHONE_INVALID]: '手机号格式不正确',
  [CAPTCHA_ERRORS.IMAGE_CAPTCHA_INVALID]: '图形验证码错误',
  [CAPTCHA_ERRORS.SMS_CODE_INVALID]: '短信验证码错误',
  [CAPTCHA_ERRORS.SEND_TOO_FREQUENT]: '发送过于频繁，请稍后再试',
  [CAPTCHA_ERRORS.RETRY_LIMIT_EXCEEDED]: '重试次数过多，请稍后再试',
  [CAPTCHA_ERRORS.NETWORK_ERROR]: '网络错误，请检查网络连接',
  [CAPTCHA_ERRORS.SERVER_ERROR]: '服务器错误，请稍后重试'
}

/**
 * 获取错误信息
 * @param {string} errorType 错误类型
 * @returns {string} 错误信息
 */
export function getCaptchaErrorMessage(errorType) {
  return CAPTCHA_ERROR_MESSAGES[errorType] || '未知错误'
}
